package com.cs.paoyer.common.exception;




/**
 * Representa informaci�n detallada de un posible error 'configurable' que puede
 * ocurrir en una aplicaci�n.
 *
 * Aqu� se hace aluci�n a un error 'configurable' queriendo decir con esto que es
 * un error que se espera de cierta manera en la aplicaci�n y cuya informaci�n, tal como
 * modulo, descripci�n y detalles, es almacenada en unas clases espec�ficas para
 * su posterior consulta.
 *
 * @version 0.9
 */
public class ExceptionVO implements java.io.Serializable {

  /**
   * Codigo de la excepcion.
   */
  private int id;

  /**
   * Codigo del modulo al cual pertenece la excepcion. Se utiliza para los logs.
   */
  private int module;

  /**
   * Texto corto explicativo respecto a la excepcion.
   */
  private String message;

  /**
   * Informacion detallada respecto a la excepcion; incluye sugerencias.
   */
  private String detail;

  /**
   * Constructor de la excepcion que inicializa los atributos basicos.
   *
   * @param id      Codigo de la excepcion.
   * @param module  Codigo del modulo al cual pertenece la excepcion.
   * @param message Texto corto explicativo respecto a la excepcion
   */
  public ExceptionVO( int id,
                      int module,
                      String message ) {

    this( id, module, message, null );
  }

  /**
   * Constructor de la excepcion que inicializa los atributos basicos.
   *
   * @param id      Codigo de la excepcion.
   * @param message Texto corto explicativo respecto a la excepcion.
   * @param detail  Informacion detallada respecto a la excepcion; incluye sugerencias.
   */
  public ExceptionVO( int id,
                      String message,
                      String detail ) {
      this( id, 0, message, detail );
  }

  /**
   * Constructor de la excepcion que inicializa los atributos basicos.
   *
   * @param id      Codigo de la excepcion.
   * @param module  Codigo del modulo al cual pertenece la excepcion.
   * @param message Texto corto explicativo respecto a la excepcion.
   * @param detail  Informacion detallada respecto a la excepcion; incluye sugerencias.
   */
  public ExceptionVO( int id,
                      int module,
                      String message,
                      String detail ) {

    this.id = id;
    this.module = module;
    this.message = message;
    this.detail = detail;
  }


  /**
   * Devuelve informaci�n detallada de una excepci�n, como el m�dulo al que pertenece,
   * una descripci�n y un detalle.
   *
   * @return  String          Una descripci�n detallada de un error.
   *
   */
  public String toString() {
  String tokenInitialString = "_[[";
  String tokenFinalString   = "]]";

    return tokenInitialString + this.module + "_" + this.id + tokenFinalString +
               " " + this.message + "\n" + this.detail;
  }

  /**
   * Obtiene la informaci�n del ID asoicado a este error.
   *
   * @return Codigo de la excepcion
   */
  public int getId() {
    return this.id;
  }

  /**
   * Obtiene el codigo del modulo al cual pertenece la excepcion.
   * @return Codigo del modulo al cual pertenece la excepcion.
   */
  public int getModule() {
    return module;
  }

  /**
   * Obtiene un texto corto explicativo respecto a la excepcion
   *
   * @return Texto corto explicativo respecto a la excepcion.
   */
  public String getMessage() {
    return message;
  }

  /**
   * Obtiene informacion detallada respecto a la excepcion; incluye sugerencias.
   *
   * @return Informacion detallada respecto a la excepcion; incluye sugerencias.
   */
  public String getDetail() {
    return detail;
  }

  /**
   * Remplaza los caracteres comodines '?' de la cadena de message
   * por los valores del arreglo parametros[]
   * @param parametros String[] Valores de los parametros
   */
  protected void setParametersMessage(String[] parametros){

    StringBuffer buffer = new StringBuffer(message);
    int i=-1;
    //Se utiliza la Cadena y no el StringBuffer para el indexOf()
    //porque en la version 1.3 del JDK el StringBuffer no tiene este metodo
    for (int p=0; (p<parametros.length && (i = message.indexOf("?", i+1)) != -1);p++) {
      buffer.insert(i+1,parametros[p]);
      message = buffer.toString();
    }
    message = message.replace('?',' ');
  }//-- setParametersMessage()

  private static void main(String[] args) {
   
  }

}
